package android.slc.jacob

import cn.hutool.core.io.FileUtil
import cn.hutool.core.io.file.FileNameUtil
import com.jacob.activeX.ActiveXComponent
import com.jacob.com.ComThread
import com.jacob.com.Dispatch
import java.io.File
import javax.swing.filechooser.FileSystemView

/**
 * window系统的快捷方式工具类
 */
object ShortCutUtils {

    /**
     * 创建快捷方式
     *
     * @param sourceFile 源文件路径
     */
    fun createShortCut(sourceFile: String, isCover: Boolean = true): File? {
        if (!System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS")) {
            println("当前系统不是window系统,无法创建快捷方式!!")
            return null
        }
        val sourceFileParent: String = FileUtil.getParent(sourceFile, 1)
        val sourceFileName: String = FileNameUtil.getPrefix(sourceFile)
        val linkFile = FileUtil.file(sourceFileParent, "$sourceFileName.lnk")
        if (!isCover && linkFile.exists()) {
            return linkFile
        }
        val icon = FileUtil.file(sourceFileParent, "$sourceFileName.ico").absolutePath
        val shell = ActiveXComponent("WScript.Shell")
        val shellDispatch: Dispatch = shell.getObject()
        try {
            // 创建快捷方式
            val shortcut: Dispatch = Dispatch.call(shellDispatch, "CreateShortcut", linkFile.absolutePath).toDispatch()
            // 设置快捷方式的属性
            Dispatch.put(shortcut, "TargetPath", sourceFile)
            Dispatch.put(shortcut, "WorkingDirectory", sourceFileParent)
            Dispatch.put(shortcut, "IconLocation", icon)
            Dispatch.put(shortcut, "Description", sourceFileName)

            // 保存快捷方式
            Dispatch.call(shortcut, "Save")
            // 释放资源
            shortcut.safeRelease()
            shellDispatch.safeRelease()
            ComThread.Release()
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return linkFile
    }

    /**
     * 创建快捷方式
     *
     * @param sourceFile 源文件
     */
    fun createShortCut(sourceFile: File, isCover: Boolean = true): File? {
        return createShortCut(sourceFile.absolutePath, isCover)
    }

    /**
     * 设置软件开机启动
     *
     * @param sourceFile 源文件
     */
    fun createAppStartup(sourceFile: File, isCover: Boolean = true): File? {
        val lnkFile = createShortCut(sourceFile, isCover)
        lnkFile?.let {
            try {
                val startUpFile = File(startup, "${sourceFile.nameWithoutExtension}.lnk")
                if (isCover || !startUpFile.exists()) {
                    //复制到启动文件夹,若快捷方式已存在则覆盖原来的
                    lnkFile.copyTo(startUpFile, true)
                    //删除缓存的快捷方式
                    lnkFile.delete()
                }
                return if (startUpFile.exists()) {
                    startUpFile
                } else {
                    null
                }
            } catch (e: Exception) {
                return null
            }
        }
        return null
    }

    /**
     * 设置软件开机启动
     *
     * @param sourceFile 源文件路径
     */
    fun createAppStartup(sourceFile: String, isCover: Boolean = true): File? {
        return createAppStartup(File(sourceFile), isCover)
    }

    /**
     * 设置软件桌面快捷方式
     *
     * @param sourceFile 源文件路径
     */
    fun createDesktopShortCut(sourceFile: File, desktopShortCutName: String, isCover: Boolean = true): File? {
        val lnkFile = createShortCut(sourceFile, isCover)
        lnkFile?.let {
            try {
                val startUpFile = File(desktop, "${desktopShortCutName}.lnk")
                if (isCover || !startUpFile.exists()) {
                    //复制到启动文件夹,若快捷方式已存在则覆盖原来的
                    lnkFile.copyTo(startUpFile, true)
                    //删除缓存的快捷方式
                    lnkFile.delete()
                }
                return if (startUpFile.exists()) {
                    startUpFile
                } else {
                    null
                }
            } catch (e: Exception) {
                return null
            }
        }
        return null
    }

    /**
     * 设置软件桌面快捷方式
     *
     * @param sourceFile 源文件路径
     */
    fun createDesktopShortCut(sourceFile: String, desktopShortCutName: String, isCover: Boolean = true): File? {
        return createDesktopShortCut(File(sourceFile), desktopShortCutName, isCover)
    }

    /**
     * 设置软件桌面快捷方式
     *
     * @param sourceFile 源文件路径
     */
    fun createDesktopShortCut(sourceFile: File, isCover: Boolean = true): File? {
        return createDesktopShortCut(sourceFile, sourceFile.nameWithoutExtension, isCover)
    }

    /**
     * 设置软件桌面快捷方式
     *
     * @param sourceFile 源文件路径
     */
    fun createDesktopShortCut(sourceFile: String, isCover: Boolean = true): File? {
        val sourceFileTemp = File(sourceFile)
        return createDesktopShortCut(sourceFileTemp, sourceFileTemp.nameWithoutExtension, isCover)
    }


    /**
     * 开机启动目录
     */
    val startup =
        "${System.getProperty("user.home")}\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\"

    /**
     * 桌面目录
     */
    val desktop = FileSystemView.getFileSystemView().homeDirectory.absolutePath + "\\"

}